package queues; import java.util.concurrent.*; import gui.Gui; public class Server implements Runnable { private Client client; private BlockingQueue<Client> queue = new ArrayBlockingQueue<Client>(5); private int index; private long endTime, crtTime; private Thread thread = new Thread(); private boolean finished = false; private long initTime, avgWaitTime, avgServiceTime; private int servedClients; ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); public Server(int x) { crtTime = System.currentTimeMillis(); this.endTime = crtTime + Gui.getSimulationTime(); this.index = x; } public void run() { initTime = System.currentTimeMillis(); servedClients = 0; while (crtTime <= endTime) { if (queue.isEmpty() == false) { try { client = queue.take(); // executor.execute(client); thread = new Thread(client); Gui.showMessage("Client " + client.getID() + " is being served by server " + index); initTime = initTime + client.getArrivalTime(); servedClients++; thread.start(); thread.join(); avgServiceTime += client.getServiceTime(); avgWaitTime = avgWaitTime + (System.currentTimeMillis() - initTime); Gui.showMessage("Client " + client.getID() + " has been served by server " + index); Gui.removeFromServer(index); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } crtTime = System.currentTimeMillis(); } finished = true; avgWaitTime = avgWaitTime / servedClients; avgServiceTime = avgServiceTime / servedClients; } public long getAvgWaitTime() { return avgWaitTime; } public long getAvgServiceTime() { return avgServiceTime; } public void addClient(Client c) { try { Thread.sleep(c.getArrivalTime()); queue.put(c); Gui.addToServer(index, c.getID()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public int getNoOfClients() { return queue.size(); } public boolean hasFinished() { return finished; } public int capacity() { return queue.remainingCapacity(); } }